home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / SpriteWorld 2.0 ƒ / SpriteWorld Examples / Large Background Scrolling / Large Background.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-05  |  10.8 KB  |  429 lines  |  [TEXT/KAHL]

  1. ///--------------------------------------------------------------------------------------
  2. // Large Background.c
  3. //
  4. // By Vern Jensen, August 1995
  5. ///--------------------------------------------------------------------------------------
  6.  
  7.  
  8. #include <SWFPSReport.h>
  9. #include <SWIncludes.h>
  10. #include <SWGameUtils.h>
  11.  
  12. #include "SWApplication.h"
  13. #include "Large Background.h"
  14.  
  15.  
  16.  
  17. #define kDoubleSize                    true        // doubles size of offscreen area
  18. #define kInterlacedMode                true        // turns Interlaced mode on/off
  19. #define kSyncToVBL                    false        // sync SpriteWorld to VBL?
  20. #define kWorldRectInset                0            // make SpriteWorld smaller than window
  21. #define kMaxFPS                        30            // set to 0 for unrestricted speed
  22.  
  23. #define    kNumSprites                    30            // total number of sprites
  24. #define    kMaxSpriteMoveDelta            10            // maximum speed of the sprites
  25. #define    kScrollSpeed                8            // scrolling speed in pixels
  26.  
  27.  
  28. #define    kLeftArrowKey                0x7B
  29. #define    kRightArrowKey                0x7C
  30. #define    kDownArrowKey                0x7D
  31. #define    kUpArrowKey                    0x7E
  32.  
  33. #define    kLeftKeyPad                    0x56
  34. #define    kRightKeyPad                0x58
  35. #define    kDownKeyPad                    0x54
  36. #define    kUpKeyPad                    0x5B
  37.  
  38. #define kEscKey                        0x35
  39.  
  40.  
  41.  
  42. /***********/
  43. /* Globals */
  44. /***********/
  45.  
  46. SpriteWorldPtr    gSpriteWorldP;
  47. SpritePtr        gSpriteArray[kNumSprites];
  48. Rect            gOffscreenRect;
  49. PicHandle        gBackPictH;
  50. WindowPtr        gWindowP;
  51.  
  52.  
  53. struct moveKeys
  54. {
  55.     Boolean    up;
  56.     Boolean    right;
  57.     Boolean    down;
  58.     Boolean    left;
  59. } keys;
  60.  
  61.  
  62.  
  63.  
  64. ///--------------------------------------------------------------------------------------
  65. // Main
  66. ///--------------------------------------------------------------------------------------
  67.  
  68. void    main( void )
  69. {
  70.     Initialize(kNumberOfMoreMastersCalls);
  71.     
  72.     if (SWHasSystem7())
  73.     {
  74.         AllowKeyUpEvents();
  75.         SetCursor(*GetCursor(watchCursor));
  76.         
  77.         CreateSpriteWorld();
  78.         CreateSprites();
  79.         
  80.         SetUpAnimation();
  81.         RunAnimation();
  82.         ShutDown();
  83.         
  84.         RestoreEventMask();
  85.     }
  86.     else
  87.     {
  88.         CantRunOnThisMachine();
  89.     }
  90. }
  91.  
  92.  
  93. ///--------------------------------------------------------------------------------------
  94. // CreateSpriteWorld
  95. ///--------------------------------------------------------------------------------------
  96.  
  97.  
  98. void    CreateSpriteWorld( void )
  99. {
  100.     RgnHandle    mBarUpdateRgn;
  101.     Rect        windRect, worldRect;
  102.     OSErr        err;
  103.     
  104.     gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
  105.     
  106.     if (gWindowP != NULL)
  107.     {
  108.             // Center window in screen
  109.         windRect = gWindowP->portRect;
  110.         CenterRect(&windRect, &qd.screenBits.bounds);
  111.         MoveWindow(gWindowP, windRect.left, windRect.top, false);
  112.         
  113.         ShowWindow(gWindowP);
  114.         SetPort(gWindowP);
  115.         mBarUpdateRgn = HideMenuBar(gWindowP); // Must be done *after* showing window!
  116.         EraseRgn(mBarUpdateRgn);
  117.         
  118.         if (kInterlacedMode)
  119.             PaintRect(&gWindowP->portRect);    // Black out window for Interlaced mode
  120.     }
  121.     else
  122.         CantFindResource();
  123.     
  124.     
  125.     err = SWEnterSpriteWorld();
  126.     FatalError(err);
  127.     
  128.     
  129.     if ( GetDepthFromWindow(gWindowP) <= 2 )
  130.         gBackPictH = GetPicture(129);    // B&W pict
  131.     else
  132.         gBackPictH = GetPicture(128);    // Color pict
  133.  
  134.     if (gBackPictH == nil)
  135.     {
  136.         SysBeep( 10 );
  137.         ExitToShell();
  138.     }
  139.     
  140.     gOffscreenRect = (**(gBackPictH)).picFrame;
  141.     
  142.     if (kDoubleSize)
  143.     {
  144.         gOffscreenRect.right *= 2;
  145.         gOffscreenRect.bottom *= 2;
  146.     }
  147.     
  148.     
  149.     worldRect = gWindowP->portRect;
  150.     InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
  151.     
  152.     
  153.         // Create the SpriteWorld
  154.     err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP, 
  155.             &worldRect, &gOffscreenRect);
  156.     FatalError(err);
  157. }
  158.     
  159.     
  160. ///--------------------------------------------------------------------------------------
  161. // CreateSprites
  162. ///--------------------------------------------------------------------------------------
  163.  
  164. void    CreateSprites( void )
  165. {
  166.     SpriteLayerPtr        spriteLayerP;
  167.     SpritePtr            simpleSpriteP;
  168.     short                spriteNum;
  169.     OSErr                err;
  170.     
  171.     
  172.         // Create the sprite layer
  173.     err = SWCreateSpriteLayer(&spriteLayerP);
  174.     FatalError(err);
  175.     
  176.         // Create the first sprite
  177.     err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &gSpriteArray[0], NULL, 
  178.             128, 1, kFatMask);    
  179.     FatalError(err);
  180.     
  181.     SWCompileSprite(gSpriteArray[0]);
  182.     
  183.         // clone the rest of the sprites off the first one
  184.     for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
  185.     {
  186.         err = SWCloneSprite(gSpriteArray[0], &gSpriteArray[spriteNum], NULL);
  187.         FatalError(err);
  188.     }
  189.     
  190.     
  191.         // Set up the sprites in random locations with random deltas
  192.     for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
  193.     {
  194.         simpleSpriteP = gSpriteArray[spriteNum];
  195.  
  196.         SWSetSpriteMoveBounds(simpleSpriteP, &gOffscreenRect);
  197.         SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
  198.         
  199.         SWSetSpriteLocation(simpleSpriteP, 
  200.                 GetRandom(0, gOffscreenRect.right), 
  201.                 GetRandom(0, gOffscreenRect.bottom) );
  202.         
  203.         SWSetSpriteMoveDelta(simpleSpriteP, 
  204.                 GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta), 
  205.                 GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta));
  206.         
  207.         
  208.         if (gSpriteWorldP->pixelDepth == 8)        // 256 colors
  209.         {
  210.             if (kInterlacedMode)
  211.                 SWSetSpriteDrawProc(simpleSpriteP, BP8BitInterlacedMaskDrawProc);
  212.             else
  213.                 SWSetSpriteDrawProc(simpleSpriteP, CompiledSprite8BitDrawProc);
  214.         }
  215.         else                                    // Not 256 colors
  216.         {
  217. #if !SW_PPC        // Use interlaced drawProcs unless in B&W, where interlacing is ugly
  218.             if (kInterlacedMode && gSpriteWorldP->pixelDepth != 1)
  219.                 SWSetSpriteDrawProc(simpleSpriteP, BPAllBitInterlacedMaskDrawProc);
  220.             else
  221.                 SWSetSpriteDrawProc(simpleSpriteP, BlitPixieAllBitMaskDrawProc);
  222. #endif
  223.         }
  224.     }
  225.     
  226.     
  227.         // add the sprites to the layer
  228.     for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
  229.         SWAddSprite(spriteLayerP, gSpriteArray[spriteNum]);
  230.     
  231.         // add the layer to the world
  232.     SWAddSpriteLayer(gSpriteWorldP, spriteLayerP);
  233.     
  234.     
  235.         // Lock the sprite world
  236.     SWLockSpriteWorld(gSpriteWorldP);
  237. }
  238.  
  239.  
  240. ///--------------------------------------------------------------------------------------
  241. // SetUpAnimation
  242. ///--------------------------------------------------------------------------------------
  243.  
  244. void    SetUpAnimation( void )
  245. {
  246.     SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
  247.     SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
  248.     
  249.     SWSetScrollingWorldMoveBounds(gSpriteWorldP, &gSpriteWorldP->backRect);
  250.     SWSetScrollingWorldMoveProc(gSpriteWorldP, KeyScrollRectMoveProc, NULL);
  251. //    SWSetScrollingWorldMoveProc(gSpriteWorldP, AutoScrollMoveProc, NULL);
  252.     
  253.     
  254.     if (gSpriteWorldP->pixelDepth == 8)        // 256 Colors
  255.     {
  256.         if (kInterlacedMode)
  257.         {
  258.             SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BP8BitInterlacedRectDrawProc);
  259.             SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BP8BitInterlacedRectDrawProc);
  260.         }
  261.         else
  262.         {
  263.             SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixie8BitRectDrawProc);
  264.         }
  265.     }
  266.     else                                    // Not 256 Colors
  267.     {
  268. #if !SW_PPC
  269.             // Use interlaced drawProcs unless in B&W, where interlacing is ugly
  270.         if (kInterlacedMode && gSpriteWorldP->pixelDepth != 1)
  271.         {
  272.             SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BPAllBitInterlacedRectDrawProc);
  273.             SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BPAllBitInterlacedRectDrawProc);
  274.         }
  275.         else
  276.         {
  277.             SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixieAllBitRectDrawProc);
  278.             SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BlitPixieAllBitRectDrawProc);
  279.         }
  280. #endif
  281.     }
  282.     
  283.     
  284.     ForeColor(blackColor);
  285.     BackColor(whiteColor);
  286.     
  287.         // Draw background
  288.     SWSetPortToBackground(gSpriteWorldP);
  289.     DrawPicture(gBackPictH, &gOffscreenRect);
  290.     
  291.     SetCursor(&qd.arrow);
  292.     HideCursor();
  293.     
  294.     SWUpdateScrollingSpriteWorld(gSpriteWorldP, true);
  295. }
  296.  
  297.  
  298. ///--------------------------------------------------------------------------------------
  299. //  RunAnimation
  300. ///--------------------------------------------------------------------------------------
  301.  
  302.     
  303. void    RunAnimation( void )
  304. {
  305.     unsigned long        frames;
  306.     
  307.     frames = 0;
  308.     StartTimer();
  309.     
  310.     while (!Button())
  311.     {
  312.         SWProcessScrollingSpriteWorld(gSpriteWorldP);
  313.         SWAnimateScrollingSpriteWorld(gSpriteWorldP);
  314.         
  315.         if (gSpriteWorldP->frameHasOccured)
  316.             frames++;
  317.     }
  318.     
  319.     ShowMenuBar(gWindowP);
  320.     ShowResults(frames);
  321. }
  322.  
  323.  
  324. ///--------------------------------------------------------------------------------------
  325. //  ShutDown (clean up and dispose of the SpriteWorld)
  326. ///--------------------------------------------------------------------------------------
  327.  
  328.  
  329. void    ShutDown( void )
  330. {
  331.     SWUnlockSpriteWorld(gSpriteWorldP);
  332.     SWDisposeSpriteWorld(gSpriteWorldP);
  333.     SWExitSpriteWorld();
  334.     
  335.     FlushEvents(everyEvent, 0);
  336.     ShowCursor();
  337. }
  338.  
  339.  
  340. ///--------------------------------------------------------------------------------------
  341. //  BallSpriteMoveProc
  342. ///--------------------------------------------------------------------------------------
  343.  
  344.  
  345. void    BallSpriteMoveProc(SpritePtr ballSpriteP)
  346. {    
  347.     SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
  348.     
  349. //    SWBounceSprite(ballSpriteP);
  350.     SWWrapSprite(ballSpriteP);
  351. }
  352.  
  353.  
  354. ///--------------------------------------------------------------------------------------
  355. //  KeyScrollRectMoveProc
  356. ///--------------------------------------------------------------------------------------
  357.  
  358.  
  359. void    KeyScrollRectMoveProc(
  360.     SpriteWorldPtr spriteWorldP,
  361.     SpritePtr followSpriteP)
  362. {    
  363.     UpdateKeys();
  364.     
  365.     spriteWorldP->vertScrollDelta = (keys.down - keys.up) * kScrollSpeed;        
  366.     spriteWorldP->horizScrollDelta = (keys.right - keys.left) * kScrollSpeed;
  367. }
  368.  
  369.  
  370. ///--------------------------------------------------------------------------------------
  371. //  AutoScrollMoveProc - optional scrolling move proc
  372. ///--------------------------------------------------------------------------------------
  373.  
  374.  
  375. void    AutoScrollMoveProc(
  376.     SpriteWorldPtr spriteWorldP,
  377.     SpritePtr followSpriteP)
  378. {    
  379.     if (!spriteWorldP->horizScrollDelta && !spriteWorldP->vertScrollDelta)
  380.     {
  381.         spriteWorldP->horizScrollDelta = kScrollSpeed - 1;
  382.         spriteWorldP->vertScrollDelta = kScrollSpeed;
  383.     }
  384.     
  385.     if (spriteWorldP->visScrollRect.bottom + spriteWorldP->vertScrollDelta > 
  386.         spriteWorldP->scrollRectMoveBounds.bottom ||
  387.         spriteWorldP->visScrollRect.top + spriteWorldP->vertScrollDelta < 
  388.         spriteWorldP->scrollRectMoveBounds.top)
  389.     {
  390.         spriteWorldP->vertScrollDelta *= -1;
  391.     }
  392.     
  393.     if (spriteWorldP->visScrollRect.right + spriteWorldP->horizScrollDelta > 
  394.         spriteWorldP->scrollRectMoveBounds.right ||
  395.         spriteWorldP->visScrollRect.left + spriteWorldP->horizScrollDelta < 
  396.         spriteWorldP->scrollRectMoveBounds.left)
  397.     {
  398.         spriteWorldP->horizScrollDelta *= -1;
  399.     }
  400. }
  401.  
  402.  
  403. ///--------------------------------------------------------------------------------------
  404. //  UpdateKeys (Put the latest key values in the keys structure)
  405. ///--------------------------------------------------------------------------------------
  406.  
  407.  
  408. void    UpdateKeys( void )
  409. {
  410.     EventRecord        event;
  411.     short            theKey;
  412.     Boolean            isDown;
  413.     
  414.     while ( GetOSEvent( (keyUpMask | keyDownMask), &event ) )
  415.     {
  416.         theKey = (event.message & keyCodeMask) >> 8;
  417.         isDown = (event.what != keyUp);
  418.         
  419.         if ( (theKey == kLeftArrowKey) || (theKey == kLeftKeyPad) )
  420.             keys.left = isDown;
  421.         else if ( (theKey == kRightArrowKey) || (theKey == kRightKeyPad) )
  422.             keys.right = isDown;
  423.         else if ( (theKey == kDownArrowKey) || (theKey == kDownKeyPad) )
  424.             keys.down = isDown;
  425.         else if ( (theKey == kUpArrowKey) || (theKey == kUpKeyPad) )
  426.             keys.up = isDown;
  427.     }
  428. }
  429.